#Obtener argumento desde la linea de comando
$files = $args[0]

#funcion que nos da datestamp apropiada para nombre de carpeta como YYYYMMDD
function DateForFolder {
    If ((Get-Date).Month -lt 10) {
	[string]$month = "0"+(Get-Date).Month
	}
	Else {
	[string]$month = (Get-Date).Month
	}

    If ((Get-Date).Day -lt 10) {
	[string]$day = "0"+(Get-Date).Day
	}
	Else {
	[string]$day = (Get-Date).Day
	}
	
	[string]$date = [string](Get-Date).Year+$month+$day
	
	Return $date
}

[string]${stUserDomain},[string]${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\") #Guardamos dominio y usuario actual para uso futuro (Ver $OutputPath)
[string]$currentdate = DateForFolder #Guardamos fecha actual para nombrar carpetas
[string]$OutputPath = "C:\Users\"+$stUserAccount+"\Desktop\PDF Output" #Obtenemos path de guardado según usuario actual
New-Item $OutputPath -type directory -EA SilentlyContinue #Creamos directorio en caso de que no exista, si ya existe ignoramos el error

#Referencia al formato de guardado e inicialización del COM Object para Word (se mata al final)
[ref]$SaveFormat = "microsoft.office.interop.word.WdSaveFormat" -as [type]
$word = New-Object -ComObject word.application

#Verificar primero si argumento pasado es un directorio
If (Test-Path $files -pathType container) {
    Write-Output ("Buscando y convirtiendo archivos de Word en "+$files)
	
	#En cuyo caso, buscamos la lista de archivos -incluyendo subdirectorio- y filtramos aquellos con extension .docx y .doc
	$alldocs = Get-ChildItem $files -Recurse | Where-Object {$_.Extension -eq ".docx" -Or $_.Extension -eq ".doc"}
	
	[string]$WorkPath = $OutputPath+"\"+$currentdate #Dirección destino según fecha y directorio de salida anteriormente mencionado
	New-Item $WorkPath -type directory | Out-Null #Creamos carpeta de trabajo para la fecha actual, dentro del directorio de salida
	
	$folders = Get-ChildItem $files -Directory -Recurse #Obtenemos estructura de carpetas desde directorio de origen
	$originalfolder = Split-Path $files -leaf #Obtenemos nombre de carpeta original
	$SavePath = $WorkPath+"\"+$originalfolder #Directorio de destino final, con todo lo anterior y usando la carpeta original como raíz para el resto de los archivos
	New-Item $SavePath -type directory -EA SilentlyContinue | Out-Null #la creamos dentro de carpeta de trabajo
	
	Foreach ($folder in $folders) { #Creamos carpetas en estructura anterior
	    [string] $oldpath = $folder.Fullname
		[string] $newpath = $oldpath.Replace($files, $SavePath)
		
		If (!(Test-Path $newpath)) {
		    New-Item $newpath -type directory -EA SilentlyContinue | Out-Null
			Write-Output ("Directorio '"+$newpath+"' creado")
			}
		}
	
	Foreach ($doc in $alldocs) {
	    $opendoc = $word.Documents.Open($doc.FullName) #Abro Word
		$newname = $opendoc.Name.Replace(".docx",".pdf").Replace(".doc",".pdf") #Cambio extensiones en nombre
		[string]$parentpath = Split-Path $opendoc.FullName #Obtengo directorio del archivo
		$newpath = $parentpath.Replace([string]$files,[string]$SavePath)+"\"+$newname #Reemplace la ruta original con la nueva ruta de trabajo
		$opendoc.SaveAs([ref]$newpath,[ref]17)
		$opendoc.close()
		
		Write-Output $newpath
		}
	}
	ElseIf ($files -like "*.doc" -Or $files -like "*.docx"){
	    $SavePath = $OutputPath+"\"+$currentdate #Directorio de salida, solo con la fecha de hoy
		If (!(Test-Path $SavePath)) { #Si no existe, lo creamos
		    New-Item $SavePath -type directory -EA SilentlyContinue | Out-Null #No queremos ver la salida del cmd-let
			Write-Output ("Directorio '"+$SavePath+"' creado")
			}
		
		$opendoc = $word.Documents.Open($files) #Abro Word
		$newname = $opendoc.Name.Replace(".docx",".pdf").Replace(".doc",".pdf") #Cambio extensiones en nombre
		$newpath = [string]$SavePath+"\"+$newname #Reemplazar la ruta original con la nueva ruta de trabajo
		$opendoc.SaveAs([ref]$newpath,[ref]17) #Finalmente, guardamos. La funcion exige pasar variables por referencia
		$opendoc.close()
		
		Write-Output $newpath
	}	
	Else {
        Write-Output "Archivo no soportado"
	}

#Cerrar word y asegurarse de que el COM Object no quede en segundo plano
$word.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Remove-Variable word